home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
edit
/
elv18src.zip
/
vi.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-13
|
22KB
|
876 lines
/* vi.c */
/* Author:
* Steve Kirkendall
* Beaverton, OR 97005
* kirkenda@cs.pdx.edu
*/
#include "config.h"
#include "ctype.h"
#include "vi.h"
/* This array describes what each key does */
#define NO_FUNC (MARK (*)())0
#define NO_ARGS 0
#define CURSOR 1
#define CURSOR_CNT_KEY 2
#define CURSOR_MOVED 3
#define CURSOR_EOL 4
#define ZERO 5
#define DIGIT 6
#define CURSOR_TEXT 7
#define KEYWORD 8
#define CURSOR_KEY 9
#define ARGSMASK 0x0f
#define C_C_K_REP1 (CURSOR_CNT_KEY | 0x10)
#define C_C_K_CUT (CURSOR_CNT_KEY | 0x20)
#define C_K_CUT (CURSOR_KEY | 0x20)
#define C_C_K_MARK (CURSOR_CNT_KEY | 0x30)
#define C_C_K_CHAR (CURSOR_CNT_KEY | 0x40)
#ifndef NO_SHOWMODE
static int keymodes[] = {0, WHEN_REP1, WHEN_CUT, WHEN_MARK, WHEN_CHAR};
# define KEYMODE(args) (keymodes[(args) >> 4])
#else
# define KEYMODE(args) 0
#endif
static struct keystru
{
MARK (*func)(); /* the function to run */
uchar args; /* description of the args needed */
#ifndef NO_VISIBLE
short flags;
#else
uchar flags; /* other stuff */
#endif
}
vikeys[] =
{
/* NUL not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#ifndef NO_EXTENSIONS
/* ^A find cursor word */ {m_wsrch, KEYWORD, MVMT|NREL|VIZ},
#else
/* ^A not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* ^B page backward */ {m_scroll, CURSOR, FRNT|VIZ},
/* ^C not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* ^D scroll dn 1/2page*/ {m_scroll, CURSOR, NCOL|VIZ},
/* ^E scroll up */ {m_scroll, CURSOR, NCOL|VIZ},
/* ^F page forward */ {m_scroll, CURSOR, FRNT|VIZ},
/* ^G show file status */ {v_status, NO_ARGS, NO_FLAGS},
/* ^H move left, like h*/ {m_left, CURSOR, MVMT|VIZ},
/* ^I not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* ^J move down */ {m_updnto, CURSOR, MVMT|LNMD|VIZ|INCL},
/* ^K not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* ^L redraw screen */ {v_redraw, NO_ARGS, NO_FLAGS|VIZ},
/* ^M mv front next ln */ {m_updnto, CURSOR, MVMT|FRNT|LNMD|VIZ|INCL},
/* ^N move down */ {m_updnto, CURSOR, MVMT|LNMD|VIZ|INCL|NCOL},
/* ^O not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* ^P move up */ {m_updnto, CURSOR, MVMT|LNMD|VIZ|INCL|NCOL},
/* ^Q not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* ^R redraw screen */ {v_redraw, NO_ARGS, NO_FLAGS|VIZ},
/* ^S not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#ifndef NO_TAGSTACK
/* ^T pop tagstack */ {v_pop, CURSOR, NO_FLAGS},
#else
/* ^T not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* ^U scroll up 1/2page*/ {m_scroll, CURSOR, NCOL|VIZ},
/* ^V not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* ^W not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* ^X move to phys col */ {m_tocol, CURSOR, MVMT|NREL|VIZ},
/* ^Y scroll down */ {m_scroll, CURSOR, NCOL|VIZ},
#ifdef SIGTSTP
/* ^Z suspend elvis */ {v_suspend, NO_ARGS, NO_FLAGS},
#else
/* ^Z not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* ESC not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* ^\ not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* ^] keyword is tag */ {v_tag, KEYWORD, NO_FLAGS},
/* ^^ previous file */ {v_switch, CURSOR, FRNT},
/* ^_ move to row */ {m_row, CURSOR, MVMT|NCOL|INCL|VIZ},
/* SPC move right,like l*/ {m_right, CURSOR, MVMT|INCL|VIZ},
/* ! run thru filter */ {v_filter, CURSOR_MOVED, FRNT|LNMD|INCL|VIZ},
/* " select cut buffer*/ {v_selcut, C_K_CUT, PTMV|VIZ},
#ifndef NO_EXTENSIONS
/* # increment number */ {v_increment, KEYWORD, SDOT},
#else
/* # not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* $ move to rear */ {m_rear, CURSOR, MVMT|INCL|VIZ},
/* % move to match */ {m_match, CURSOR, MVMT|INCL|VIZ},
/* & repeat subst */ {v_again, CURSOR_MOVED, SDOT|NCOL|LNMD|INCL},
/* ' move to a mark */ {m_tomark, C_C_K_MARK, MVMT|FRNT|NREL|LNMD|INCL|VIZ},
#ifndef NO_SENTENCE
/* ( mv back sentence */ {m_sentence, CURSOR, MVMT|VIZ},
/* ) mv fwd sentence */ {m_sentence, CURSOR, MVMT|VIZ},
#else
/* ( not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* ) not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
#ifndef NO_ERRLIST
/* * errlist */ {v_errlist, CURSOR, FRNT|NREL},
#else
/* * not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* + mv front next ln */ {m_updnto, CURSOR, MVMT|FRNT|LNMD|VIZ|INCL},
#ifndef NO_CHARSEARCH
/* , reverse [fFtT] cmd*/ {m__ch, CURSOR, MVMT|INCL|VIZ},
#else
/* , not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* - mv front prev ln */ {m_updnto, CURSOR, MVMT|FRNT|LNMD|VIZ|INCL},
/* . special... */ {NO_FUNC, NO_ARGS, NO_FLAGS},
/* / forward search */ {m_fsrch, CURSOR_TEXT, MVMT|NREL|VIZ},
/* 0 part of count? */ {NO_FUNC, ZERO, MVMT|PTMV|VIZ},
/* 1 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ},
/* 2 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ},
/* 3 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ},
/* 4 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ},
/* 5 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ},
/* 6 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ},
/* 7 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ},
/* 8 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ},
/* 9 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ},
/* : run single EX cmd*/ {v_1ex, CURSOR_TEXT, NO_FLAGS|VIZ},
#ifndef NO_CHARSEARCH
/* ; repeat [fFtT] cmd*/ {m__ch, CURSOR, MVMT|INCL|VIZ},
#else
/* ; not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS|VIZ},
#endif
/* < shift text left */ {v_lshift, CURSOR_MOVED, SDOT|FRNT|LNMD|INCL|VIZ},
/* = preset filter */ {v_reformat, CURSOR_MOVED, SDOT|FRNT|LNMD|INCL|VIZ},
/* > shift text right */ {v_rshift, CURSOR_MOVED, SDOT|FRNT|LNMD|INCL|VIZ},
/* ? backward search */ {m_bsrch, CURSOR_TEXT, MVMT|NREL|VIZ},
#ifndef NO_AT
/* @ execute a cutbuf */ {v_at, C_C_K_CUT, NO_FLAGS},
#else
/* @ not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* A append at EOL */ {v_insert, CURSOR, SDOT},
/* B move back Word */ {m_bword, CURSOR, MVMT|VIZ},
/* C change to EOL */ {v_change, CURSOR_EOL, SDOT},
/* D delete to EOL */ {v_delete, CURSOR_EOL, SDOT},
/* E move end of Word */ {m_eword, CURSOR, MVMT|INCL|VIZ},
#ifndef NO_CHARSEARCH
/* F move bk to char */ {m_Fch, C_C_K_CHAR, MVMT|INCL|VIZ},
#else
/* F not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* G move to line # */ {m_updnto, CURSOR, MVMT|NREL|LNMD|FRNT|INCL|VIZ},
/* H move to row */ {m_row, CURSOR, MVMT|LNMD|FRNT|VIZ|INCL},
/* I insert at front */ {v_insert, CURSOR, SDOT},
/* J join lines */ {v_join, CURSOR, SDOT},
#ifndef NO_EXTENSIONS
/* K look up keyword */ {v_keyword, KEYWORD, NO_FLAGS},
#else
/* K not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* L move to last row */ {m_row, CURSOR, MVMT|LNMD|FRNT|VIZ|INCL},
/* M move to mid row */ {m_row, CURSOR, MVMT|LNMD|FRNT|VIZ|INCL},
/* N reverse prev srch*/ {m_nsrch, CURSOR, MVMT|NREL|VIZ},
/* O insert above line*/ {v_insert, CURSOR, SDOT},
/* P paste before */ {v_paste, CURSOR, SDOT},
/* Q quit to EX mode */ {v_quit, NO_ARGS, NO_FLAGS},
/* R overtype */ {v_overtype, CURSOR, SDOT},
/* S change line */ {v_change, CURSOR_MOVED, SDOT},
#ifndef NO_CHARSEARCH
/* T move bk to char */ {m_Tch, C_C_K_CHAR, MVMT|INCL|VIZ},
#else
/* T not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* U undo whole line */ {v_undoline, CURSOR, FRNT},
#ifndef NO_VISIBLE
/* V start visible */ {v_start, CURSOR, INCL|LNMD|VIZ},
#else
/* V not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* W move forward Word*/ {m_fword, CURSOR, MVMT|INCL|NWRP|VIZ},
/* X delete to left */ {v_xchar, CURSOR, SDOT},
/* Y yank text */ {v_yank, CURSOR_MOVED, NCOL},
/* Z save file & exit */ {v_xit, CURSOR_CNT_KEY, NO_FLAGS},
/* [ move back section*/ {m_paragraph, CURSOR, MVMT|LNMD|NREL|VIZ},
#ifndef NO_POPUP
/* \ pop-up menu */ {v_popup, CURSOR_MOVED, VIZ},
#else
/* \ not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS},
#endif
/* ] move fwd section */ {m_paragraph, CURSOR, MVMT|LNMD|NREL|VIZ},
/* ^ move to front */ {m_front, CURSOR, MVMT|VIZ},
/* _ current line */ {m_updnto, CURSOR, MVMT|LNMD|FRNT|INCL},
/* ` move to mark */ {m_tomark, C_C_K_MARK, MVMT|NREL|VIZ},
/* a append at cursor */ {v_insert, CURSOR, SDOT},
/* b move back word */ {m_bword, CURSOR, MVMT|VIZ},
/* c change text */ {v_change, CURSOR_MOVED, SDOT|VIZ},
/* d delete op */ {v_de